package mytar

import (
	"archive/tar"
	"fmt"
	"io"
	"io/fs"
	"os"
	"path/filepath"
	"strings"
)

// TarFile 打包文件
func TarFile(filesource string, info os.FileInfo, tarwriter *tar.Writer) error {
	// 打开文件
	afile, err := os.Open(filesource)
	if err != nil {
		fmt.Println(err)
		return err
	}
	// 关闭文件句柄
	defer afile.Close()
	// 头文件信息
	header, err := tar.FileInfoHeader(info, "")
	if err != nil {
		fmt.Println(err)
		return err
	}
	header.Name = filepath.Base(filesource)
	// 写入文件
	err = tarwriter.WriteHeader(header)
	if err != nil {
		fmt.Println(err)
		return err
	}

	if _, err = io.Copy(tarwriter, afile); err != nil {
		fmt.Println(err)
		return err
	}
	return nil
}

// 打包文件夹
func TarFolder(filesource string, trawriter *tar.Writer) error {
	return filepath.Walk(filesource, func(targetpath string, info fs.FileInfo, err error) error {
		if info == nil {
			return err
		}
		if info.IsDir() {
			if filesource == targetpath {
				return nil
			}
			header, err := tar.FileInfoHeader(info, "")
			if err != nil {
				return err
			}
			header.Name = filepath.Join(filesource, strings.TrimPrefix(targetpath, filesource))
			if err = trawriter.WriteHeader(header); err != nil {
				return err
			}
			os.Mkdir(strings.TrimPrefix(filesource, info.Name()), os.ModeDir)
			return TarFolder(targetpath, trawriter)
		}
		return TarFile(targetpath, info, trawriter)
	})
}
func Tar(fileTarget string, tar_dir string) (err error) {

	// 创建打包文件
	tarfile, err := os.Create(fileTarget)

	if err != nil {
		if err == os.ErrExist {
			if err = os.Remove(fileTarget); err != nil {
				fmt.Println(err)
			}
		} else {
			fmt.Println(err)
		}
	}
	// 关闭文件
	defer tarfile.Close()
	defer func() {
		os.RemoveAll(tar_dir)
	}()
	// 写入文件句柄
	trawriter := tar.NewWriter(tarfile)
	// 获取文件信息
	sfileInfo, err := os.Stat(tar_dir)
	if err != nil {
		fmt.Println(err)
	}
	// 判断是否是文件或者文件夹
	if !sfileInfo.IsDir() {
		err = TarFile(tar_dir, sfileInfo, trawriter)
	} else {
		tar_dir = strings.ReplaceAll(tar_dir, "/", "\\")
		err = TarFolder(tar_dir, trawriter)
	}
	return
}
